package agencia;

import java.util.Collection;
import java.util.Date;
import agencia.exceptions.LugarInsuficienteException;


public class ReservaDePaquete {
	
	private Paquete paquete;
	private Collection<Pasajero> pasajeros;
	private Date diaReserva = new Date();
	private double precioTotal ;
	private PlanDePago planPago;
	
	final float porcentajeReserva = Float.valueOf("0.3");
	final float porcentajeDevolucion = Float.valueOf("0.2");
	final int horasPreCancelacion = 96;
	
	public enum Estado {
		Abierta,
		Confirmada,
		Cancelada,
		Cerrada,
	};
	
	private Estado estado;
	
	public ReservaDePaquete (Paquete paquete, Collection<Pasajero> pasajeros){
		this.paquete = paquete;
		this.pasajeros = pasajeros;
		
		this.precioTotal = this.paquete.determinarPrecio() * this.pasajeros.size();		
		this.estado = Estado.Abierta;
	}
	
	public void ConfirmarReserva() throws LugarInsuficienteException{
		this.diaReserva = new Date();
		if (this.ConsultarDisponibilidad())
		{
			//this.paquete.reservar();
			this.estado=Estado.Confirmada;
		}
		else
			throw new LugarInsuficienteException("No existen lugares suficientes para concretar la reserva"); 
		}
	
	public double CancelarReserva(){
		// Se calclulan las horas desde la fecha de reserva.
		Date today = new Date();
		int horasDesdeReserva = (int) ((today.getTime() - this.diaReserva.getTime()) / (1000 * 60 * 60));
		//Devuelve el importe a devolver por la cancelacion
		this.estado=Estado.Cancelada;
		
		if (horasDesdeReserva > horasPreCancelacion)
			return 0;
		else
			return (this.GetCostoReserva() * porcentajeDevolucion);
	}

	public Date GetDiaReserva (){
		return this.diaReserva;
	}
	
	public double GetPrecio(){
		return this.precioTotal;
	}
	
	public double GetCostoReserva(){
		return this.precioTotal * porcentajeReserva;
	}

	public boolean ConsultarDisponibilidad(){
		if (this.paquete.determinarLugaresLibres()< this.pasajeros.size())
			return false;
		else
			return true;
	}
	
	public void DefinirPlanDePago(Date fechaCierre)
	{
		this.planPago = new PlanDePago(this.precioTotal, fechaCierre);
	}

	public Estado getEstado() {
		return estado;
	}
}
